#!/usr/bin/python
# -*- coding: utf-8 -*-
# @version        : 1.0
# @Creaet Time    : 2021/10/18 22:19 
# @File           : models.py
# @IDE            : PyCharm
# @desc           : ORM 模型


from sqlalchemy import Boolean, Column, ForeignKey, Integer, String, DateTime, func, Text
from sqlalchemy.orm import relationship

"""从 database 文件中导入 Model，创建从其继承的类。这些类是 ORM 模型。"""
from .database import Model


class User(Model):
    """
    用户模型

    该类就是一个 ORM 模型，继承自 Model 基本映射类，在模型映射到数据库中，必须要继承这个类。

    该__tablename__属性告诉 SQLAlchemy 在数据库中为这些模型中的每一个使用的表的名称。

    其他属性中的每一个都代表其相应数据库表中的一列。我们使用 SQLAlchemy 的 Column 作为默认值。

    然后，我们将一个 SQLAlchemy 类『类型』作为 Integer、String 和 Boolean 传递，该类将数据库中的类型定义为参数。

    常用字段参数：https://www.jianshu.com/p/b7d1b19706fc
    """
    __tablename__ = "users"

    id = Column(Integer, primary_key=True, index=True)
    email = Column(String(200), unique=True, nullable=False, index=True, comment="邮箱")
    username = Column(String(200), unique=True, nullable=False, index=True, comment="用户名")
    nickname = Column(String(200), unique=False, nullable=True, index=True, comment="昵称")
    password = Column(String(200), nullable=False, comment="密码")
    is_active = Column(Boolean, default=True, comment="是否可用")

    """ SQLAlchemy ORM 提供的 relationship 用于创建关联关系，'Item'是关联的类名；back_populates来指定反向访问的属性名称"""
    items = relationship("Item", back_populates="owner")

    """
    server_default=func.now()：默认为当前时间
    onupdate=func.now()：更新后，自动更新为当前时间
    """
    create_time = Column(DateTime, server_default=func.now(), comment='创建时间')
    update_time = Column(DateTime, server_default=func.now(), onupdate=func.now(), comment='更新时间')

    def __repr__(self):
        return f'{self.username}_{self.nickname}'


class Item(Model):
    """
    项目模型
    """
    __tablename__ = "items"

    id = Column(Integer, primary_key=True, index=True)
    title = Column(String(200), index=True, nullable=False, comment="标题")
    description = Column(Text, index=True, nullable=False, comment="描述")

    """ ForeignKey 用于创建外键，参数格式不是类名.属性名，而是表名.字段名"""
    owner_id = Column(Integer, ForeignKey("users.id"))

    owner = relationship("User", back_populates="items")

    create_time = Column(DateTime, server_default=func.now(), comment='创建时间')
    update_time = Column(DateTime, server_default=func.now(), onupdate=func.now(), comment='更新时间')

    def __repr__(self):
        return self.title